iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Mobile Development

Spring Boot & Android Studio教學系列 第 10

深入解析 Spring Boot 中的 @OneToOne 資料庫關聯

  • 分享至 

  • xImage
  •  

關聯

關聯是一個強大的概念,它有助於開發者建立高效、可測試且易於維護的應用程序。通過適當地管理組件之間的關聯,開發者可以更容易地構建和維護具有高度可擴展性的應用程序。

@OneToOne

用於建立實體類之間的一對一資料庫關聯。它允許您在兩個實體類之間建立一種特殊類型的關聯,其中一個實體對象與另一個實體對象相關聯。

cascade

表示關聯實體之間在特定操作(例如保存、更新、刪除等)時的自動行為的一個設定屬性。

CascadeType.ALL:當父實體進行任何操作時,自動對關聯的所有子實體執行相同的操作(包括保存、更新、刪除等)。

CascadeType.PERSIST:當父實體進行保存(persist)操作時,自動對關聯的子實體執行保存操作。

CascadeType.MERGE:當父實體進行更新(merge)操作時,自動對關聯的子實體執行更新操作。

CascadeType.REMOVE:當父實體進行刪除(remove)操作時,自動對關聯的子實體執行刪除操作。

CascadeType.REFRESH:當父實體進行刷新(refresh)操作時,自動對關聯的子實體執行刷新操作。

fetch

是用於指定實體之間關聯查詢時加載策略的屬性。它用於控制關聯實體在查詢時是否被立即加載,以及如何加載。

EAGER(立即加載): 使用 EAGER 策略時,JPA 在查詢實體時會立即加載關聯實體的數據。這意味著當你獲取一個實體時,與之關聯的其他實體也會被一同加載。這樣可以確保在獲取主實體後,關聯的實體數據都已經準備好,可以立即訪問。

LAZY(延遲加載): 使用 LAZY 策略時,JPA 在查詢實體時不會立即加載關聯實體的數據。相反,只有當你第一次訪問關聯實體時,它的數據才會被加載。這樣可以避免在查詢主實體時立即加載大量關聯實體數據,節省資源和提高性能。

orphanRemoval

關聯所指向的物件沒有其他的關聯對象,就被稱為「孤立物件」。"orphanRemoval" 是一種在關聯性映射中的功能,它允許自動刪除這些孤立的物件,以確保資料庫中的資料與應用程式的物件模型保持一致。
簡單舉例,orphanRemoval為true的情況下,假設你有一個部門裡面有一些員工,當部門被移除所有員工資料也會被移除

mappedBy

告訴JPA自己不是關係維護端,同時也讓JPA知道維護方是誰,也決定擁有方與被擁有方(通常是擁有方,也就是Many那方)。以mappedBy = "door"為例,他指向了Key類中的door作為維護方,因此Key類中將會有外鍵用於表示與Door類的關聯。
當Door類想去查看有哪些key是與其對應的就必須向private Door door;去取得對應Key類的資料

範例

假設我有兩個實體類分別為Door與Key,一個門對應一把鑰匙,這時候就應該設定關聯使得鑰匙可以對應到匹配的門

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Door {
    @Id
    @GeneratedValue
    private Long id;
    private String doorName;
    private String type;
}


@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Key {
    @Id
    @GeneratedValue
    private Long id;
    private String keyName;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(name = "door_id")// 指定在Key表中的外鍵欄位名稱
    private Door door;
}

我們在屬性key上方添加了@OneToOne註解

接著去抓出我們key的資料

@PostMapping("/ex")
public Key ex(){
    var door = Door.builder()
            .type("open")
            .doorName("digDoor")
            .build();
    doorRepository.save(door);
    var key = Key.builder()
            .keyName("digKey")
            .door(door) //這裡將此鑰匙著名與剛剛創建的門有關聯
            .build();
    keyRepository.save(key);
    return key;
}

可以發現抓出key後也可以知道他與哪個門有關


上一篇
參數傳遞指南:讓資料流動無阻
下一篇
建立實體關係:@ManyToOne和@OneToMany的用法
系列文
Spring Boot & Android Studio教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言